Ponovitev benchmarka na 15 minutnih podatkih

Ker smo v prejšnji datoteki preizkusili modele le na urnih podatkih, se bomo zdaj osredotočili na 15 minutne frekvence. Vprašanje, ki se mi postavlja je, ali je bolje vzeti samo podatke, ki so na voljo pri iskani frekvenci, ali je morda bolje model “učiti” na večjih podatkih in prirediti rezultate na višje frekvence npr. tako, da enakomerno razdelimo odjem na manjših intervalih.

Tukaj preizkušam, kako se modeli obnesejo kadar jih nauičimo na 15minutnih in interpoliranih podatkih.

Zdaj naredimo sezonsko dekompozicijo časovne vrste.

data_all_15_combined$ELCE %>% msts( seasonal.periods = c(4*24, 4*24*7, 4*24*365)) %>% mstl() %>% autoplot()

Benchmark 1 in 2

Prva modela, ki ju bomo prezkusili za napovedovanje odjema sta modela sezonske dekompozicije, kjer bomo vsako od zgornjih sezonskih komponent modelirali z dvema metodama - eksponentnim glajenjem in arima modelom.

splits <- initial_time_split(data_all_15_combined, prop = 0.85)

decomp_model_ets <- seasonal_reg(
  mode = "regression",
  seasonal_period_1 = 4*24,
  seasonal_period_2 = 4*7*24,
  seasonal_period_3 = 4*365*24
) %>% set_engine("stlm_ets") %>% fit(formula = ELCE ~ DateTime, data=training(splits))

decomp_model_arima <- seasonal_reg(
  mode = "regression",
  seasonal_period_1 = 4*24,
  seasonal_period_2 = 4*7*24,
  seasonal_period_3 = 4*365*24
) %>% set_engine("stlm_arima") %>% fit(formula = ELCE ~ DateTime, data=training(splits))

models_tbl <- modeltime_table(
    decomp_model_ets,
    decomp_model_arima
)


forecast_tbl <-  models_tbl %>%
    modeltime_forecast(new_data = testing(splits),
                       quiet = FALSE)

actual_tbl <- data_all_15_combined %>% tail(4*1000*24) %>%
  mutate(.model_id = 0, .model_desc = "Actual", .key = "Actual") %>%
  rename(.index = DateTime, .value = ELCE)

forecast_tbl_all <- rbind(forecast_tbl, actual_tbl)

forecast_tbl_all %>%
  plot_modeltime_forecast(.conf_interval_show = FALSE ,.interactive = TRUE)
data_cv <- data.frame(data_all_15_combined) %>% time_series_cv(initial = "6 year, 4 months", assess = "1 month", skip="1 month")
## Using date_var: DateTime
data_cv %>% plot_time_series_cv_plan(
        DateTime, ELCE, # date variable and value variable
        # Additional arguments passed to plot_time_series(),
        .facet_ncol = 4,
        .line_alpha = 0.5,
        .interactive = FALSE
    )

cross_validation <- models_tbl %>%
    modeltime_fit_resamples(
        resamples = data_cv,
        control   = control_resamples(verbose = TRUE)
    )
## * Model ID: 1 SEASONAL DECOMP: ETS(M,AD,N)
## i Slice01: preprocessor 1/1
## <U+221A> Slice01: preprocessor 1/1
## i Slice01: preprocessor 1/1, model 1/1
## <U+221A> Slice01: preprocessor 1/1, model 1/1
## i Slice01: preprocessor 1/1, model 1/1 (predictions)
## i Slice02: preprocessor 1/1
## <U+221A> Slice02: preprocessor 1/1
## i Slice02: preprocessor 1/1, model 1/1
## <U+221A> Slice02: preprocessor 1/1, model 1/1
## i Slice02: preprocessor 1/1, model 1/1 (predictions)
## i Slice03: preprocessor 1/1
## <U+221A> Slice03: preprocessor 1/1
## i Slice03: preprocessor 1/1, model 1/1
## <U+221A> Slice03: preprocessor 1/1, model 1/1
## i Slice03: preprocessor 1/1, model 1/1 (predictions)
## i Slice04: preprocessor 1/1
## <U+221A> Slice04: preprocessor 1/1
## i Slice04: preprocessor 1/1, model 1/1
## <U+221A> Slice04: preprocessor 1/1, model 1/1
## i Slice04: preprocessor 1/1, model 1/1 (predictions)
## i Slice05: preprocessor 1/1
## <U+221A> Slice05: preprocessor 1/1
## i Slice05: preprocessor 1/1, model 1/1
## <U+221A> Slice05: preprocessor 1/1, model 1/1
## i Slice05: preprocessor 1/1, model 1/1 (predictions)
## i Slice06: preprocessor 1/1
## <U+221A> Slice06: preprocessor 1/1
## i Slice06: preprocessor 1/1, model 1/1
## <U+221A> Slice06: preprocessor 1/1, model 1/1
## i Slice06: preprocessor 1/1, model 1/1 (predictions)
## i Slice07: preprocessor 1/1
## <U+221A> Slice07: preprocessor 1/1
## i Slice07: preprocessor 1/1, model 1/1
## <U+221A> Slice07: preprocessor 1/1, model 1/1
## i Slice07: preprocessor 1/1, model 1/1 (predictions)
## i Slice08: preprocessor 1/1
## <U+221A> Slice08: preprocessor 1/1
## i Slice08: preprocessor 1/1, model 1/1
## <U+221A> Slice08: preprocessor 1/1, model 1/1
## i Slice08: preprocessor 1/1, model 1/1 (predictions)
## i Slice09: preprocessor 1/1
## <U+221A> Slice09: preprocessor 1/1
## i Slice09: preprocessor 1/1, model 1/1
## <U+221A> Slice09: preprocessor 1/1, model 1/1
## i Slice09: preprocessor 1/1, model 1/1 (predictions)
## i Slice10: preprocessor 1/1
## <U+221A> Slice10: preprocessor 1/1
## i Slice10: preprocessor 1/1, model 1/1
## <U+221A> Slice10: preprocessor 1/1, model 1/1
## i Slice10: preprocessor 1/1, model 1/1 (predictions)
## i Slice11: preprocessor 1/1
## <U+221A> Slice11: preprocessor 1/1
## i Slice11: preprocessor 1/1, model 1/1
## <U+221A> Slice11: preprocessor 1/1, model 1/1
## i Slice11: preprocessor 1/1, model 1/1 (predictions)
## i Slice12: preprocessor 1/1
## <U+221A> Slice12: preprocessor 1/1
## i Slice12: preprocessor 1/1, model 1/1
## <U+221A> Slice12: preprocessor 1/1, model 1/1
## i Slice12: preprocessor 1/1, model 1/1 (predictions)
## * Model ID: 2 SEASONAL DECOMP: ARIMA(4,1,4) WITH DRIFT
## i Slice01: preprocessor 1/1
## <U+221A> Slice01: preprocessor 1/1
## i Slice01: preprocessor 1/1, model 1/1
## <U+221A> Slice01: preprocessor 1/1, model 1/1
## i Slice01: preprocessor 1/1, model 1/1 (predictions)
## i Slice02: preprocessor 1/1
## <U+221A> Slice02: preprocessor 1/1
## i Slice02: preprocessor 1/1, model 1/1
## <U+221A> Slice02: preprocessor 1/1, model 1/1
## i Slice02: preprocessor 1/1, model 1/1 (predictions)
## i Slice03: preprocessor 1/1
## <U+221A> Slice03: preprocessor 1/1
## i Slice03: preprocessor 1/1, model 1/1
## <U+221A> Slice03: preprocessor 1/1, model 1/1
## i Slice03: preprocessor 1/1, model 1/1 (predictions)
## i Slice04: preprocessor 1/1
## <U+221A> Slice04: preprocessor 1/1
## i Slice04: preprocessor 1/1, model 1/1
## <U+221A> Slice04: preprocessor 1/1, model 1/1
## i Slice04: preprocessor 1/1, model 1/1 (predictions)
## i Slice05: preprocessor 1/1
## <U+221A> Slice05: preprocessor 1/1
## i Slice05: preprocessor 1/1, model 1/1
## <U+221A> Slice05: preprocessor 1/1, model 1/1
## i Slice05: preprocessor 1/1, model 1/1 (predictions)
## i Slice06: preprocessor 1/1
## <U+221A> Slice06: preprocessor 1/1
## i Slice06: preprocessor 1/1, model 1/1
## <U+221A> Slice06: preprocessor 1/1, model 1/1
## i Slice06: preprocessor 1/1, model 1/1 (predictions)
## i Slice07: preprocessor 1/1
## <U+221A> Slice07: preprocessor 1/1
## i Slice07: preprocessor 1/1, model 1/1
## <U+221A> Slice07: preprocessor 1/1, model 1/1
## i Slice07: preprocessor 1/1, model 1/1 (predictions)
## i Slice08: preprocessor 1/1
## <U+221A> Slice08: preprocessor 1/1
## i Slice08: preprocessor 1/1, model 1/1
## <U+221A> Slice08: preprocessor 1/1, model 1/1
## i Slice08: preprocessor 1/1, model 1/1 (predictions)
## i Slice09: preprocessor 1/1
## <U+221A> Slice09: preprocessor 1/1
## i Slice09: preprocessor 1/1, model 1/1
## <U+221A> Slice09: preprocessor 1/1, model 1/1
## i Slice09: preprocessor 1/1, model 1/1 (predictions)
## i Slice10: preprocessor 1/1
## <U+221A> Slice10: preprocessor 1/1
## i Slice10: preprocessor 1/1, model 1/1
## <U+221A> Slice10: preprocessor 1/1, model 1/1
## i Slice10: preprocessor 1/1, model 1/1 (predictions)
## i Slice11: preprocessor 1/1
## <U+221A> Slice11: preprocessor 1/1
## i Slice11: preprocessor 1/1, model 1/1
## <U+221A> Slice11: preprocessor 1/1, model 1/1
## i Slice11: preprocessor 1/1, model 1/1 (predictions)
## i Slice12: preprocessor 1/1
## <U+221A> Slice12: preprocessor 1/1
## i Slice12: preprocessor 1/1, model 1/1
## <U+221A> Slice12: preprocessor 1/1, model 1/1
## i Slice12: preprocessor 1/1, model 1/1 (predictions)
cross_validation %>%
    plot_modeltime_resamples(
      .metric_set = metric_set(mae, mape, mase, rmse),
      .point_size  = 3, 
      .point_alpha = 0.8,
      .interactive = FALSE
    )

cross_validation %>%
    modeltime_resample_accuracy(metric_set=metric_set(mae),
                                summary_fns = c(mean=mean, min=min, max=max)) %>%
    table_modeltime_accuracy(.interactive = FALSE)
Accuracy Table
.model_id .model_desc .type n mae_mean mae_min mae_max
1 SEASONAL DECOMP: ETS(M,AD,N) Resamples 12 2.11 1.03 4.56
2 SEASONAL DECOMP: ARIMA(4,1,4) WITH DRIFT Resamples 12 1.97 0.88 4.21
cross_validation %>%
    modeltime_resample_accuracy(metric_set=metric_set(mape),
                                summary_fns = c(mean=mean, min=min, max=max)) %>%
    table_modeltime_accuracy(.interactive = FALSE)
Accuracy Table
.model_id .model_desc .type n mape_mean mape_min mape_max
1 SEASONAL DECOMP: ETS(M,AD,N) Resamples 12 9.16 5.23 19.96
2 SEASONAL DECOMP: ARIMA(4,1,4) WITH DRIFT Resamples 12 8.36 4.45 18.32